From e00f842a5b0fbea7ab12fe9470926b8e4d146f08 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sat, 23 Mar 2002 17:35:09 +0000 Subject: [PATCH] disconnect layout handlers earlier in the function, to avoid possible 2002-03-23 Havoc Pennington * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect layout handlers earlier in the function, to avoid possible reentrancy screwups (gtk_text_view_invalidate): Don't install idle handlers if layout == NULL, otherwise we get problems during finalization since clearing the buffer invalidates and puts the idle handlers back after we destroy the layout. #74660 (gtk_text_view_ensure_layout): Install the validation handlers right after creating the layout. * gtk/gtktexttagtable.c (foreach_unref): call _gtk_text_buffer_notify_will_remove_tag(), #75126 --- ChangeLog | 15 +++++++++++++++ ChangeLog.pre-2-10 | 15 +++++++++++++++ ChangeLog.pre-2-2 | 15 +++++++++++++++ ChangeLog.pre-2-4 | 15 +++++++++++++++ ChangeLog.pre-2-6 | 15 +++++++++++++++ ChangeLog.pre-2-8 | 15 +++++++++++++++ gtk/gtktexttagtable.c | 11 +++++++++++ gtk/gtktextview.c | 21 ++++++++++++++------- 8 files changed, 115 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index d19050c805..8473ad6410 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d19050c805..8473ad6410 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index d19050c805..8473ad6410 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index d19050c805..8473ad6410 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d19050c805..8473ad6410 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d19050c805..8473ad6410 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,18 @@ +2002-03-23 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_destroy_layout): disconnect + layout handlers earlier in the function, to avoid possible + reentrancy screwups + (gtk_text_view_invalidate): Don't install idle handlers if + layout == NULL, otherwise we get problems during finalization + since clearing the buffer invalidates and puts the idle handlers + back after we destroy the layout. #74660 + (gtk_text_view_ensure_layout): Install the validation handlers + right after creating the layout. + + * gtk/gtktexttagtable.c (foreach_unref): call + _gtk_text_buffer_notify_will_remove_tag(), #75126 + 2002-03-22 Havoc Pennington * gdk/x11/gdkfont-x11.c (gdk_fontset_load): add more explanatory diff --git a/gtk/gtktexttagtable.c b/gtk/gtktexttagtable.c index 70c690092d..993f5d1b34 100644 --- a/gtk/gtktexttagtable.c +++ b/gtk/gtktexttagtable.c @@ -135,10 +135,21 @@ gtk_text_tag_table_new (void) static void foreach_unref (GtkTextTag *tag, gpointer data) { + GSList *tmp; + /* We don't want to emit the remove signal here; so we just unparent * and unref the tag. */ + tmp = tag->table->buffers; + while (tmp != NULL) + { + _gtk_text_buffer_notify_will_remove_tag (GTK_TEXT_BUFFER (tmp->data), + tag); + + tmp = tmp->next; + } + tag->table = NULL; g_object_unref (G_OBJECT (tag)); } diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 230cc83318..31c58109a2 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -2431,7 +2431,7 @@ gtk_text_view_finalize (GObject *object) text_window_free (text_view->bottom_window); g_object_unref (G_OBJECT (text_view->im_context)); - + (* G_OBJECT_CLASS (parent_class)->finalize) (object); } @@ -3091,6 +3091,10 @@ gtk_text_view_invalidate (GtkTextView *text_view) text_view->onscreen_validated)); text_view->onscreen_validated = FALSE; + + /* We'll invalidate when the layout is created */ + if (text_view->layout == NULL) + return; if (!text_view->first_validate_idle) { @@ -5261,6 +5265,8 @@ gtk_text_view_ensure_layout (GtkTextView *text_view) tmp_list = g_slist_next (tmp_list); } + + gtk_text_view_invalidate (text_view); } } @@ -5297,6 +5303,13 @@ gtk_text_view_destroy_layout (GtkTextView *text_view) GSList *tmp_list; gtk_text_view_remove_validate_idles (text_view); + + g_signal_handlers_disconnect_by_func (G_OBJECT (text_view->layout), + (gpointer) invalidated_handler, + text_view); + g_signal_handlers_disconnect_by_func (G_OBJECT (text_view->layout), + (gpointer) changed_handler, + text_view); /* Remove layout from all anchored children */ tmp_list = text_view->children; @@ -5316,12 +5329,6 @@ gtk_text_view_destroy_layout (GtkTextView *text_view) gtk_text_view_stop_cursor_blink (text_view); gtk_text_view_end_selection_drag (text_view, NULL); - g_signal_handlers_disconnect_by_func (G_OBJECT (text_view->layout), - (gpointer) invalidated_handler, - text_view); - g_signal_handlers_disconnect_by_func (G_OBJECT (text_view->layout), - (gpointer) changed_handler, - text_view); g_object_unref (G_OBJECT (text_view->layout)); text_view->layout = NULL; } -- 2.30.2